]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Revert "windowManager: Use new reorder_workspace() API"
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 8 Oct 2019 18:42:20 +0000 (20:42 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Tue, 8 Oct 2019 19:11:19 +0000 (21:11 +0200)
It's too easy to break, so revert to the old code until we
figure out a fix.

This reverts commit ff9bb5399b1d22fceaf00c9fc8e0058f24af96cc.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1497

js/ui/windowManager.js

index ff2f089645ff231ae02a3757b4cffd6f60c414cf..c9e48e7a3eb7f70e1a7ff9b17862baccc416ab2f 100644 (file)
@@ -1212,9 +1212,41 @@ var WindowManager = class {
         if (!Meta.prefs_get_dynamic_workspaces())
             return;
 
-        let newWs = workspaceManager.append_new_workspace(
-            false, global.get_current_time());
-        workspaceManager.reorder_workspace(newWs, pos);
+        workspaceManager.append_new_workspace(false, global.get_current_time());
+
+        let windows = global.get_window_actors().map(a => a.meta_window);
+
+        // To create a new workspace, we slide all the windows on workspaces
+        // below us to the next workspace, leaving a blank workspace for us
+        // to recycle.
+        windows.forEach(window => {
+            // If the window is attached to an ancestor, we don't need/want
+            // to move it
+            if (window.get_transient_for() != null)
+                return;
+            // Same for OR windows
+            if (window.is_override_redirect())
+                return;
+            // Sticky windows don't need moving, in fact moving would
+            // unstick them
+            if (window.on_all_workspaces)
+                return;
+            // Windows on workspaces below pos don't need moving
+            let index = window.get_workspace().index();
+            if (index < pos)
+                return;
+            window.change_workspace_by_index(index + 1, true);
+        });
+
+        // If the new workspace was inserted before the active workspace,
+        // activate the workspace to which its windows went
+        let activeIndex = workspaceManager.get_active_workspace_index();
+        if (activeIndex >= pos) {
+            let newWs = workspaceManager.get_workspace_by_index(activeIndex + 1);
+            this._blockAnimations = true;
+            newWs.activate(global.get_current_time());
+            this._blockAnimations = false;
+        }
     }
 
     keepWorkspaceAlive(workspace, duration) {